package models

import (
	"gorm.io/gorm"
	"time"
	"user_srv/basic/config"
)

type User struct {
	Id                       uint64    `gorm:"column:id;type:bigint UNSIGNED;primaryKey;not null;" json:"id"`
	Mobile                   string    `gorm:"column:mobile;type:char(11);comment:电话号码;not null;" json:"mobile"`                                                          // 电话号码
	Password                 string    `gorm:"column:password;type:varchar(60);comment:密码;not null;" json:"password"`                                                     // 密码
	NickName                 string    `gorm:"column:nick_name;type:varchar(50);comment:昵称;not null;" json:"nick_name"`                                                   // 昵称
	RealName                 string    `gorm:"column:real_name;type:varchar(20);comment:真实姓名;default:NULL;" json:"real_name"`                                             // 真实姓名
	IdCard                   string    `gorm:"column:id_card;type:char(18);comment:身份证号;default:NULL;" json:"id_card"`                                                    // 身份证号
	Sex                      int8      `gorm:"column:sex;type:tinyint(1);comment:性别 1-男 2-女;not null;" json:"sex"`                                                        // 性别 1-男 2-女
	Address                  string    `gorm:"column:address;type:varchar(100);comment:地址;default:NULL;" json:"address"`                                                  // 地址
	IdCardVerificationStatus int8      `gorm:"column:id_card_verification_status;type:tinyint(1);comment:是否实名  1未实名  2已实名;default:1;" json:"id_card_verification_status"` // 是否实名  1未实名  2已实名
	Signature                string    `gorm:"column:signature;type:varchar(50);comment:个性签名;default:NULL;" json:"signature"`                                             // 个性签名
	Status                   int8      `gorm:"column:status;type:tinyint(1);comment:在线状态  0-离线 1-在线;default:NULL;" json:"status"`                                         // 在线状态  0-离线 1-在线
	Role                     uint8     `gorm:"column:role;type:tinyint UNSIGNED;comment:角色 1-普通用户 2-快递员 3-运营方;default:1;" json:"role"`                                    // 角色 1-普通用户 2-快递员 3-运营方
	Latitude                 *float64  `gorm:"column:latitude;type:decimal(10,7);comment:纬度;default:NULL;" json:"latitude"`                                               // 纬度（-90 到 90）
	Longitude                *float64  `gorm:"column:longitude;type:decimal(10,7);comment:经度;default:NULL;" json:"longitude"`                                             // 经度（-180 到 180）
	LocationAccuracy         *float64  `gorm:"column:location_accuracy;type:decimal(8,2);comment:位置精度(米);default:NULL;" json:"location_accuracy"`                         // 位置精度（米）
	LocationSource           string    `gorm:"column:location_source;type:varchar(20);comment:位置来源;default:NULL;" json:"location_source"`                                 // 位置来源（GPS/WiFi/基站）
	LocationAddress          string    `gorm:"column:location_address;type:varchar(200);comment:详细地址;default:NULL;" json:"location_address"`                              // 详细地址
	LocationCity             string    `gorm:"column:location_city;type:varchar(50);comment:城市;default:NULL;" json:"location_city"`                                       // 城市
	LocationDistrict         string    `gorm:"column:location_district;type:varchar(50);comment:区县;default:NULL;" json:"location_district"`                               // 区县
	LocationProvince         string    `gorm:"column:location_province;type:varchar(50);comment:省份;default:NULL;" json:"location_province"`                               // 省份
	LocationUpdatedAt        time.Time `gorm:"column:location_updated_at;type:datetime(3);default:NULL;" json:"location_updated_at"`                                      // 位置更新时间
	CreatedAt                time.Time `gorm:"column:created_at;type:datetime(3);not null;default:CURRENT_TIMESTAMP(3);" json:"created_at"`
	UpdatedAt                time.Time `gorm:"column:updated_at;type:datetime(3);not null;default:CURRENT_TIMESTAMP(3);" json:"updated_at"`
	DeletedAt                time.Time `gorm:"column:deleted_at;type:datetime(3);default:NULL;" json:"deleted_at"`
}

func (u *User) TableName() string {
	return "user"
}
func (u *User) Create() error {
	return config.DB.Create(&u).Error
}
func (u *User) Updates() error {
	return config.DB.Updates(&u).Error
}
func (u *User) GetById() error {
	return config.DB.Where("id = ?", u.Id).Limit(1).Find(&u).Error
}

// GetUserMobile 根据手机号查询用户
func (u *User) GetUserMobile() error {
	return config.DB.Where("mobile = ?", u.Mobile).Limit(1).Find(&u).Error
}

// UserRegisterOrLogin 用户注册
func (u *User) UserRegister() error {
	return config.DB.Create(&u).Error
}

// UserLogin 用户短信登录
func (u *User) UserLogin() error {
	return config.DB.Find(&u).Error
}

// GetUserId 根据ID查询用户
func (u *User) GetUserId() error {
	return config.DB.First(&u, u.Id).Error
}

// 更新用户个人信息
func (u *User) UserProfile() error {
	return config.DB.Updates(&u).Error
}

// PasswordLogin 用户密码登录
func (u *User) PasswordLogin() error {
	return config.DB.Where("mobile = ? and password = ?", u.Mobile, u.Password).Limit(1).Find(&u).Error
}

// GetUserProfile 获取所有用户信息
func (u *User) GetUserProfile(page, pageSize int) (list []*User, err error) {
	err = config.DB.Scopes(Paginate(page, pageSize)).Find(&list).Error
	return list, err
}

// Paginate 分页查询
func Paginate(page, pageSize int) func(db *gorm.DB) *gorm.DB {
	return func(db *gorm.DB) *gorm.DB {
		if page <= 0 {
			page = 1
		}
		switch {
		case pageSize <= 0:
			pageSize = 10
		case pageSize > 100:
			pageSize = 100
		}
		offset := (page - 1) * pageSize
		return db.Offset(offset).Limit(pageSize)
	}
}

// GetUserDetail 获取用户详情
func (u *User) GetUserDetail() error {
	return config.DB.Where("id = ?", u.Id).Limit(1).Find(&u).Error
}

// Updates 更新用户信息（部分字段）
